//多生产多消费
//在这个场景下，无需修改代码！

//构建任务2(给消费者派发任务，让消费者执行对应的任务)
#include"BlockQueue1.hpp"
#include<iostream>
#include<pthread.h>
#include<unistd.h>
#include"Task.hpp"

//消费者
void *consumer(void *args)
{
    BlockQueue<task_t> *bq = static_cast<BlockQueue<task_t>*>(args);
    while(true)
    {
    //1.消费任务
        sleep(3);
        task_t t = bq->Pop();      //进行构建任务并pop  队列拿任务
    //2.处理任务 ---> 处理任务的时候，这个任务，已经被拿到线程的上下文中了，不属于队列了！
        t();      //进行执行对应任务
    }
}

//生产者
void *productor(void *args)
{
    BlockQueue<task_t> *bq = static_cast<BlockQueue<task_t>*>(args);
    while(true)
    {   
    //1.获得任务
        std::cout<<"生产了一个任务：" << std::endl;
    //2.生产任务
        bq->Equeue(Download);
    }
}

int main()
{
    //申请阻塞队列
    BlockQueue<task_t> *bq = new BlockQueue<task_t>();

    //构建生产和消费者
    pthread_t c[1],p[1];

    //消费者两个，生产者3个
    pthread_create(c,nullptr,consumer,bq);
    // pthread_create(c+1,nullptr,consumer,bq);
    pthread_create(p,nullptr,productor,bq);
    // pthread_create(p+1,nullptr,productor,bq);
    // pthread_create(p+2,nullptr,productor,bq);

    pthread_join(c[0],nullptr);
    // pthread_join(c[1],nullptr);
    pthread_join(p[0],nullptr);
    // pthread_join(p[1],nullptr);
    // pthread_join(p[2],nullptr);
    return 0;
}